/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarAperturaPostgrado;

import com.sun.rave.web.ui.component.Hyperlink;
import entidad.Persona;
import entidad.Usuario;
import entidad.apertura.Solicitudaperturapostgrado;
import hero.interfaces.BnNodeValue;
import java.sql.Date;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import wasolicitudesfiec.AperturaPostgrado.RevisarSolicitud;
import wasolicitudesfiec.authentication.AuthenticationPhaseListener;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.CTRL_Base;
import web.util.Constantes;
import web.util.SendMailEspol;

/**
 *
 * @author kabad
 */
public class CTRL_RevisarSolicitud extends CTRL_Base {

    private RevisarSolicitud gui;
    private final String nombreProceso = Constantes.Modelo.modelo_SolicitarAperturaPostgrado;
    private final String nombreActividad = Constantes.SolicitarAperturaPostgrado.revisarSolicitud;

    public CTRL_RevisarSolicitud(RevisarSolicitud gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
        Hyperlink[] pages = new Hyperlink[2];
        Hyperlink uno = new Hyperlink();
        uno.setText("SolicitarAperturaPostgrado");
        uno.setUrl("/faces/AperturaPostgrado/SolicitarAperturaPostgrado.jsp");
        Hyperlink dos = new Hyperlink();
        dos.setText("elsegundo");
        dos.setUrl("/faces/Inicio.jsp");
        pages[0] = uno;
        pages[1] = dos;

//        gui.getPanelNavegacion2().setPaginasNavegacion(pages);
//        gui.getPanelNavegacion2().init();
    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }

    public void inicializar() throws MensajeException {
        String nombreInstancia;
        Solicitudaperturapostgrado solicitud;
        try {
            nombreInstancia = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstancia);
            int idSolicitud = Integer.parseInt((String) prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitud = logica.getLogAperturaPostgrado().leerSolicitudAperturaNivel2(idSolicitud);
            gui.getMenu().setTitulo(this.nombreProceso + "_" + idSolicitud + ": " + nombreActividad);
            gui.getDetalleSolicitarApertura().getLblSolicitante().setText(solicitud.getProfesor().getPersona().toString());
            gui.getDetalleSolicitarApertura().getLblTipo().setText(solicitud.getTipo());
            gui.getDetalleSolicitarApertura().getTxtaTema().setValue(solicitud.getTema());
            if (solicitud.getObservacionProfesor() != null) {
                gui.getDetalleSolicitarApertura().getTxtaComentarios().setValue(solicitud.getObservacionProfesor());
            } else {
                gui.getDetalleSolicitarApertura().getTxtaComentarios().setValue(Constantes.Mensajes.noComentarios);
            }
            if (solicitud.getPathArchivoAdjunto() != null) {
                gui.getDetalleSolicitarApertura().getLinkArchivo().setRendered(true);
                gui.getDetalleSolicitarApertura().getStNoArchivo().setRendered(false);
                gui.getDetalleSolicitarApertura().getLinkArchivo().setUrl(Constantes.Rutas.rutaArchivos + solicitud.getPathArchivoAdjunto().replaceAll(" ", "%20"));
                gui.getDetalleSolicitarApertura().getLinkArchivo().setText(solicitud.getNombreArchivo());
            } else {
                gui.getDetalleSolicitarApertura().getLinkArchivo().setRendered(false);
                gui.getDetalleSolicitarApertura().getStNoArchivo().setRendered(true);
            }
        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception exception) {
            Logger.getLogger(CTRL_RevisarSolicitud.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }
    }

    public void realizarActividad(String decision) throws MensajeException {
        String nombreInstancia;
        BnNodeValue actividad;
        Solicitudaperturapostgrado solicitud;
        Usuario usuarioConectado;
        usuarioConectado = (Usuario) externalContext.getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
        try {
            nombreInstancia = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstancia);
            actividad = usrSession.getNode(nombreInstancia, nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitud = Integer.parseInt((String) prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitud = logica.getLogAperturaPostgrado().leerSolicitudApertura(idSolicitud);
            solicitud.setResultadoEvaluacion(decision);
            solicitud.setObservacionDecano((String) gui.getTxtaComentarioDecano().getText());
            int idDecano = new Integer(logica.leerPersonaPorUsuario(usuario.getUsuario()).getIdPersona());
            solicitud.setFkIdDecano(idDecano);

            if (decision.equals(Constantes.Atributo.Decision.SolicitarInforme.toString())) {
                if (gui.getHfUsuarioEvaluador1().getText() != null) {
                    int idEvaluador = Integer.parseInt((String) gui.getHfUsuarioEvaluador1().getText());
                    solicitud.setFkIdEvaluador1(idEvaluador);
                    prjSession.setProperty(Constantes.Atributo.evaluador1, logica.leerPersona(idEvaluador).getUsuario());
                } else {
                    prjSession.setProperty(Constantes.Atributo.evaluador1, "comodin");
                }
                if (gui.getHfUsuarioEvaluador2().getText() != null) {
                    int idEvaluador = Integer.parseInt((String) gui.getHfUsuarioEvaluador2().getText());
                    solicitud.setFkIdEvaluador2(idEvaluador);
                    prjSession.setProperty(Constantes.Atributo.evaluador2, logica.leerPersona(idEvaluador).getUsuario());
                } else {
                    prjSession.setProperty(Constantes.Atributo.evaluador2, "comodin");
                }
                if (gui.getHfUsuarioEvaluador3().getText() != null) {
                    int idEvaluador = Integer.parseInt((String) gui.getHfUsuarioEvaluador3().getText());
                    solicitud.setFkIdEvaluador3(idEvaluador);
                    prjSession.setProperty(Constantes.Atributo.evaluador3, logica.leerPersona(idEvaluador).getUsuario());
                } else {
                    prjSession.setProperty(Constantes.Atributo.evaluador3, "comodin");
                }
            }
            if (decision.equals(Constantes.Atributo.Decision.Rechazar.toString())) {
                solicitud.setEstado(Constantes.EstadoSolicitud.Terminada.toString().toString());
            }
            solicitud = logica.getLogAperturaPostgrado().guardarYClonarSolicitudApertura(solicitud);
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitud.getIdSolicitudApertura() + "");
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.decisionRevision, decision);

            usrSession.startActivity(nombreInstancia, nombreActividad);
            usrSession.terminateActivity(nombreInstancia, nombreActividad);

            //hacemos las actividades de informe
            if (decision.equals(Constantes.Atributo.Decision.SolicitarInforme.toString())) {
                logica.autenticaComodin();
                if (gui.getHfUsuarioEvaluador1().getText() == null) {
                    String nombreActividadInforme = Constantes.SolicitarAperturaPostgrado.emitirInformeEvaluador1;
                    actividad = usrSession.getNode(nombreInstancia, nombreActividadInforme);
                    if (!(actividad != null &&
                            (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                            actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                        throw new Exception();
                    }
                    usrSession.startActivity(nombreInstancia, nombreActividadInforme);
                    usrSession.terminateActivity(nombreInstancia, nombreActividadInforme);
                }
                if (gui.getHfUsuarioEvaluador2().getText() == null) {
                    String nombreActividadInforme = Constantes.SolicitarAperturaPostgrado.emitirInformeEvaluador2;
                    actividad = usrSession.getNode(nombreInstancia, nombreActividadInforme);
                    if (!(actividad != null &&
                            (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                            actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                        throw new Exception();
                    }
                    usrSession.startActivity(nombreInstancia, nombreActividadInforme);
                    usrSession.terminateActivity(nombreInstancia, nombreActividadInforme);

                }
                if (gui.getHfUsuarioEvaluador3().getText() == null) {
                    String nombreActividadInforme = Constantes.SolicitarAperturaPostgrado.emitirInformeEvaluador3;
                    actividad = usrSession.getNode(nombreInstancia, nombreActividadInforme);
                    if (!(actividad != null &&
                            (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                            actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                        throw new Exception();
                    }
                    usrSession.startActivity(nombreInstancia, nombreActividadInforme);
                    usrSession.terminateActivity(nombreInstancia, nombreActividadInforme);

                }
                logica.autentica(usuarioConectado.getUsuario(), usuarioConectado.getPassword());
            }


            //enviar mail de notificacion
            int idSolicitudCompleta = solicitud.getFkParent();
            String subject = "";
            String message = "";
            String to = "";

            solicitud = logica.getLogAperturaPostgrado().leerSolicitudAperturaNivel2(idSolicitudCompleta);
            if (decision.equals(Constantes.Atributo.Decision.SolicitarInforme.toString())) {
                Vector<Persona> evaluadores = new Vector<Persona>();
                if (solicitud.getFkIdEvaluador1() != 0) {
                    evaluadores.add(logica.leerPersona(solicitud.getFkIdEvaluador1()));
                }
                if (solicitud.getFkIdEvaluador2() != 0) {
                    evaluadores.add(logica.leerPersona(solicitud.getFkIdEvaluador2()));
                }
                if (solicitud.getFkIdEvaluador3() != 0) {
                    evaluadores.add(logica.leerPersona(solicitud.getFkIdEvaluador3()));
                }
                String to2 = "", subject2 = "", message2 = "";
                for (Persona persona : evaluadores) {
                    to2 = persona.getCorreo();
                    subject2 = "Emisión de Informe sobre Solicitud de Apertura de Postgrado pendiente";
                    message = Constantes.TipoSolicitud.AperturaPostgrado + "_" + solicitud.getIdSolicitudApertura() + ": " +
                            "Emitir Informe" + "\n\n" + "Título: " + solicitud.toString() + "\n" +
                            "Solicitante: " + logica.leerPersona(solicitud.getFkIdProfesor()).toString() + "\n\n" +
                            "La solicitud está en espera de su informe." + "\n\n" + "Puede realizar la actividad dirigiéndose a la sección actividades pendientes del sistema." + Constantes.MensajesCorreo.referenciaSistema;
                    SendMailEspol sendMail = new SendMailEspol(to, subject, message);
                    sendMail.send();
                }
            }
            if (decision.equals(Constantes.Atributo.Decision.Rechazar.toString())) {
                to = logica.leerPersona(solicitud.getFkIdProfesor()).getCorreo();
                subject = Constantes.MensajesCorreo.tituloCorreo + "Su Solicitud de Apertura de Postgrado ha sido rechazada";
                message = Constantes.TipoSolicitud.AperturaPostgrado + "_" + solicitud.getIdSolicitudApertura() + " " +
                        "\n\n" + "Título: " + solicitud.toString() + "\n" +
                        "Solicitante: " + logica.leerPersona(solicitud.getFkIdProfesor()).toString() + "\n\n" +
                        "Su Solicitud de Apertura de Postgrado ha sido rechazada por el Decano de la Facultad." + "\n" + "Observaciones: "
                        + solicitud.getObservacionDecano() + "\n\n" + "Puede revisar su solicitud dirigiéndose a la sección historial del sistema." + Constantes.MensajesCorreo.referenciaSistema;
            SendMailEspol sendMail = new SendMailEspol(to, subject, message);
            sendMail.send();
            }
            if (decision.equals(Constantes.Atributo.Decision.Devolver.toString())) {
                to = logica.leerPersona(solicitud.getFkIdProfesor()).getCorreo();
                subject = Constantes.MensajesCorreo.tituloCorreo + "Su Solicitud de Cambio de Carrera ha sido devuelta";
                message = Constantes.TipoSolicitud.AperturaPostgrado + "_" + solicitud.getIdSolicitudApertura() + " " +
                        "\n\n" + "Título: " + solicitud.toString() + "\n" +
                        "Solicitante: " + logica.leerPersona(solicitud.getFkIdProfesor()).toString() + "\n\n" +
                        "Su Solicitud de Apertura de Postgrado ha sido devuelta por el Decano de la Facultad." + "\n" + "Observaciones: "
                        + solicitud.getObservacionDecano() + "\n\n" + "Puede reiniciar su solicitud dirigiéndose a la sección acividades pendientes del sistema." + Constantes.MensajesCorreo.referenciaSistema;
             SendMailEspol sendMail = new SendMailEspol(to, subject, message);
            sendMail.send();
            }
           

        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
            Logger.getLogger(CTRL_RevisarSolicitud.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }

    public boolean rechazar() throws MensajeException {
        FacesMessage mensaje;
        if ((gui.getTxtaComentarioDecano().getText() == null) || gui.getTxtaComentarioDecano().getText().equals("")) {
            mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ingrese una observación para esta solicitud.", "");
            facesContext.addMessage(gui.getTxtaComentarioDecano().getClientId(facesContext), mensaje);
            return false;
        }
        realizarActividad(Constantes.Atributo.Decision.Rechazar.toString());
        return true;
    }

    public boolean solicitarInforme() throws MensajeException {
        FacesMessage mensaje;
        if ((gui.getHfUsuarioEvaluador1().getText() == null) &&
                (gui.getHfUsuarioEvaluador2().getText() == null) && (gui.getHfUsuarioEvaluador3().getText() == null)) {
            mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Seleccione al menos un evaluador para la solicitud.", "");
            facesContext.addMessage(gui.getProfesor_id_lbl().getClientId(facesContext), mensaje);
            return false;
        }
        boolean evaluadoresIguales = false;
        if ((gui.getHfUsuarioEvaluador1().getText() != null) &&
                (gui.getHfUsuarioEvaluador2().getText() != null)) {
            if (gui.getHfUsuarioEvaluador1().getText().equals(gui.getHfUsuarioEvaluador2().getText())) {
                evaluadoresIguales = true;
            }
        }
        if ((gui.getHfUsuarioEvaluador1().getText() != null) &&
                (gui.getHfUsuarioEvaluador3().getText() != null)) {
            if (gui.getHfUsuarioEvaluador1().getText().equals(gui.getHfUsuarioEvaluador3().getText())) {
                evaluadoresIguales = true;
            }
        }
        if ((gui.getHfUsuarioEvaluador2().getText() != null) &&
                (gui.getHfUsuarioEvaluador3().getText() != null)) {
            if (gui.getHfUsuarioEvaluador2().getText().equals(gui.getHfUsuarioEvaluador3().getText())) {
                evaluadoresIguales = true;
            }
        }
        if (evaluadoresIguales) {
            mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Elija un evaluador diferente por cada selección", "");
            facesContext.addMessage(gui.getProfesor_id_lbl().getClientId(facesContext), mensaje);
            return false;
        }

        realizarActividad(Constantes.Atributo.Decision.SolicitarInforme.toString());
        return true;
    }

    public boolean devolver() throws MensajeException {
        FacesMessage mensaje;
        if ((gui.getTxtaComentarioDecano().getText() == null) || gui.getTxtaComentarioDecano().getText().equals("")) {
            mensaje = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ingrese una observación para esta solicitud.", "");
            facesContext.addMessage(gui.getTxtaComentarioDecano().getClientId(facesContext), mensaje);
            return false;
        }
        realizarActividad(Constantes.Atributo.Decision.Devolver.toString());
        return true;
    }

    public boolean enviaraConsejo() throws MensajeException {
        realizarActividad(Constantes.Atributo.Decision.EnviarAConsejo.toString());
        return true;
    }
}
